home *** CD-ROM | disk | FTP | other *** search
/ Plug-In Power Pack for Netscape Communicator / Plug-In Power Pack for Netscape Communicator.iso / plugins / dataviews / dvtools / demos / monitordemo / monitor.c < prev    next >
C/C++ Source or Header  |  1997-07-10  |  17KB  |  681 lines

  1. #ifndef lint
  2. static char SccsId[]= "@(#)monitor.c    V1.9    3/15/95";
  3. #endif
  4.  
  5. /*
  6. |    file name - monitor.c
  7. |===================================================================
  8. |
  9. |               copyright (c) 1989
  10. |                          V. I. Corporation
  11. |
  12. |===================================================================
  13. |
  14. |    module description/function:
  15. |
  16. |===================================================================
  17. */
  18.  
  19. #include "std.h"
  20. #include "dvstd.h"
  21. #include "dvtools.h"
  22. #include "VOstd.h"
  23. #include "dvGR.h"
  24. #include "Tfundecl.h"
  25. #include "dvinteract.h"
  26. #include "VUfundecl.h"
  27. #include "VUerfundecl.h"
  28. #include "VOfundecl.h"
  29. #include "VTfundecl.h"
  30. #include "GRfundecl.h"
  31.  
  32. #ifdef WINNT
  33. #include <windows.h>
  34. #endif /* WINNT */
  35.  
  36. /* This program can be linked to run:
  37. |
  38. |  With 100% CPU usage (which shows updates in a tight loop)
  39. |    comment #define DV_USE_TIMER
  40. |  With Time-Outs (which show update based on a timer).
  41. |    uncomment #define DV_USE_TIMER
  42. */
  43. #define DV_USE_TIMER
  44.  
  45. #ifdef DV_USE_TIMER
  46.  
  47. LOCAL INT TimeoutInterval = 25;
  48.  
  49. #ifdef WINNT
  50.  
  51. LOCAL HWND Hwnd;
  52. LOCAL VOID CALLBACK TimeOutProc V_P_((HWND hwnd,
  53.                                       UINT uMsg,
  54.                                       UINT idEvent,
  55.                                       DWORD dwTime));
  56.  
  57. #else /* UNIX */
  58.  
  59.  
  60. /* Include the X based files so we can add AppTimeOuts */
  61. #ifdef CONST
  62. #undef CONST
  63. #endif
  64.  
  65. #ifndef __STDC__
  66. #define _NO_PROTO
  67. #endif
  68.  
  69. /* X11 include files */
  70. #include <X11/Xlib.h>
  71. #include <X11/Intrinsic.h>
  72.  
  73. LOCAL XtAppContext app_context;
  74.  
  75. LOCAL  void UpdateProc V_P_((ADDRESS args, XtIntervalId *interval_id));
  76.  
  77. #endif /* WINNT */
  78. #endif /* DV_USE_TIMER */
  79.  
  80.  
  81. #define DEF_SEARCH_PATH    (ADDRESS)NULL
  82. #define DEF_DISPFORMS    (ADDRESS)NULL
  83. #define DEF_DEVICE    (ADDRESS)NULL
  84. #define DEF_COLORTAB    (ADDRESS)NULL
  85. #define DEF_SIZE    (RECTANGLE*)NULL
  86. #define DEF_PORTION    (RECTANGLE*)NULL
  87.  
  88. LOCAL DRAWPORT CurrentDrawport;
  89. LOCAL VIEW CurrentView;
  90. LOCAL OBJECT DVscreen;
  91. LOCAL SYMTABLE DrawportTable;
  92.  
  93. /* Define a structure that will keep track of NEXT & PREVIOUS displays */
  94. typedef struct DISPLAY_LIST
  95. {
  96.   DRAWPORT drawport;
  97.   struct DISPLAY_LIST *prev;
  98. } DISPLAY_LIST;
  99.  
  100. LOCAL DISPLAY_LIST *DisplayList;
  101.  
  102. #define NUM_PRELOAD_VIEWS 6
  103. LOCAL CHAR *ViewName[]=
  104. {
  105.   "proc_WAN.v",
  106.   "proc_SITE.v",
  107.   "proc_OV.v",
  108.   "proc_PLT.v",
  109.   "proc_TB.v",
  110.   "proc_OL.v",
  111. };
  112.  
  113. #define NEXT_DISPLAY    1
  114. #define PREV_DISPLAY    2
  115. #define RESET_DISPLAY   3
  116.  
  117. /* Hot Spot Names */
  118. #define QUIT_COMMAND            'Q'
  119. #define NEXT_COMMAND            'N'
  120. #define RETURN_COMMAND          'R'
  121.  
  122.  
  123. /***************** Begin Function Declarations *************/
  124. LOCAL  void UpdateDisplay V_P_((void));
  125. LOCAL  void LoadViews V_P_((void));
  126. LOCAL  DRAWPORT init_drawport V_P_((char *viewname));
  127. LOCAL  void SwitchDisplay V_P_((int choice, char *view_name));
  128. LOCAL  DRAWPORT next_display V_P_((char *view_name));
  129. LOCAL  DRAWPORT prev_display V_P_((void));
  130. LOCAL  DRAWPORT reset_display V_P_((void));
  131. LOCAL  DISPLAY_LIST *create_display_list V_P_((void));
  132. LOCAL  void del_display_list_item V_P_((DISPLAY_LIST *display_item));
  133. LOCAL  void FreeDisplayList V_P_((DISPLAY_LIST **display_info));
  134. LOCAL  DRAWPORT get_drawport V_P_((char *view_name));
  135. LOCAL  void HandlePick V_P_((OBJECT loc));
  136. LOCAL  void QuitProgram V_P_((void));
  137. LOCAL  char *StrClone V_P_((char * string));
  138. /***************** End Function Declarations *************/
  139.  
  140.  
  141. #ifdef WINNT
  142. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  143.              LPSTR lpCmdLine,  int nCmdShow  )
  144.  
  145. #else  /* Not WINNT */
  146. int 
  147. main (argc, argv)
  148.      int argc;
  149.      char *argv[];
  150.  
  151. #endif /* WINNT */
  152. {
  153.   OBJECT location;
  154.   int error_code;
  155.   char buf[50];
  156.   /* Initialize the DataViews Environment */
  157.   (VOID) TInit (DEF_SEARCH_PATH, DEF_DISPFORMS);
  158.  
  159.   /* Open a window */
  160.   VUon_copyright ();
  161.   DVscreen = TscOpenSet (DEF_DEVICE, DEF_COLORTAB,
  162.                          V_WINDOW_NAME, "DataViews Monitor Demo",
  163. #ifdef WINNT
  164.                          V_WIN32_ICON_NAME,  "monitoricon",
  165. #ifdef DOUBLE_BUFFER
  166.                          V_WIN32_DOUBLE_BUFFER,  YES,
  167. #endif /* DOUBLE_BUFFER */
  168. #else  /* Not WINNT */
  169.                          V_X_EXPOSURE_BLOCK,    YES,
  170. #endif /* WINNT */
  171.                          V_INITIAL_CURSOR,
  172.                          V_END_OF_LIST);
  173.  
  174. if(!DVscreen)
  175.  {
  176.    error_code=TscOpenError();
  177. #ifdef WINNT
  178.    sprintf(buf,"Product is not validated. Error code %d.",error_code);
  179.    MessageBox(NULL,buf,"Validation Error",MB_OK);
  180. #else
  181.    fprintf(stderr,"Product is not validated. Error code %d.",error_code);
  182. #endif
  183.    exit(error_code);
  184.   }
  185.  
  186.   /* Setup the window events */
  187.   (VOID) VOscWinEventMask ((ULONG) (V_KEYPRESS |
  188.                                     V_BUTTONPRESS |
  189.                                     V_RESIZE | V_EXPOSE |
  190.                                     V_WINDOW_QUIT),
  191.                            (ULONG) V_END_OF_LIST);
  192. #ifdef DV_USE_TIMER
  193. #ifdef WINNT
  194.     /* Get the Windows based information */
  195.     (VOID) GRget (V_WIN32_WINDOW_HANDLE, &Hwnd, V_END_OF_LIST);
  196.     
  197.  /* Post a timeout for dynamic updates
  198.   |  The timeout procedure will update the dynamics of
  199.   |  all screens which have been opened. The procedure is invoked
  200.   |  whenever the specified time interval elapses. The interval is
  201.   |  specified in milliseconds.
  202.   */
  203.     SetTimer (Hwnd, (UINT)Hwnd, TimeoutInterval, (TIMERPROC)TimeOutProc);
  204. #else /* UNIX */
  205.   /* Extract the X information so we can setup a Time-Out Proc
  206.   |  for updating....
  207.   |    Get the Xt Application Context information.
  208.   |    Post a timeout procedure will update the dynamics of
  209.   |      all screens which have been opened. The procedure is invoked
  210.   |      whenever the specified time interval elapses. The interval is
  211.   |      specified in milliseconds.
  212.   */
  213.   (VOID) GRget (V_X_APPLIC_CONTEXT, &app_context, V_END_OF_LIST);
  214.   XtAppAddTimeOut (app_context, TimeoutInterval, 
  215.            (XtTimerCallbackProc) UpdateProc, NULL);
  216. #endif /* WINNT */
  217. #endif /* DV_USE_TIMER */
  218.  
  219.   /* Load the views and draws the first one */
  220.   LoadViews ();
  221.  
  222.   /* Change the cursor */
  223.   (VOID) GRset (V_ACTIVE_CURSOR, 0);
  224.  
  225.  
  226.   FOREVER
  227.   {
  228.  
  229. #ifdef DV_USE_TIMER
  230.     /* Gather and Process User Inputs
  231.     |    Note: since we posted a time-out, the event
  232.     |    handler will call our function to handle
  233.     |    the updating of dynamic objects.
  234.     */
  235.     location = VOloWinEventPoll (V_WAIT);
  236.     
  237. #else /* Not DV_USE_TIMER */
  238.     /* Update the Display */
  239.     UpdateDisplay();
  240.  
  241.     /* Get the Event */
  242.     location = VOloWinEventPoll( V_NO_WAIT );
  243.  
  244. #endif /* DV_USE_TIMER */
  245.  
  246.     if (location)
  247.       {
  248.     switch (VOloType (location))
  249.       {
  250.       case V_EXPOSE:
  251.         (VOID) TscRedraw (DVscreen, VOloRegion (location));
  252.         break;
  253.       case V_RESIZE:
  254.         (VOID) TscReset (DVscreen);
  255.         break;
  256.       case V_WINDOW_QUIT:
  257.         QuitProgram ();
  258.         break;
  259.       case V_KEYPRESS:
  260.       case V_BUTTONPRESS:
  261.         (VOID) VUerHandleLocEvent (location);
  262.         (VOID) HandlePick (location);
  263.         break;
  264.       }        /* end switch */
  265.       }            /* end if */
  266.   }                /* end FOREVER */
  267.   return 1;
  268. }
  269.  
  270. LOCAL void
  271. UpdateDisplay
  272. V_P_ ((void))
  273. {
  274.   /* Update the current View */
  275.   (VOID) TviReadData (CurrentView);
  276.   (VOID) TdpDrawNext (CurrentDrawport);
  277. }
  278.  
  279.  
  280. #ifdef DV_USE_TIMER
  281. #ifdef WINNT
  282.  
  283. /*ARGSUSED*/
  284. LOCAL VOID CALLBACK
  285. TimeOutProc (hwnd, uMsg, idEvent, dwTime)
  286.     HWND hwnd;
  287.   UINT uMsg;
  288.     UINT idEvent;
  289.     DWORD dwTime;
  290. {
  291.     UpdateDisplay ();
  292. }
  293.  
  294. #else /* UNIX */
  295. /*ARGSUSED*/
  296. LOCAL void 
  297. UpdateProc (args, interval_id)
  298.      ADDRESS args;
  299.      XtIntervalId *interval_id;
  300. {
  301.  
  302.   UpdateDisplay ();
  303.  
  304.   /* Re-Post the Time-Out */
  305.   XtAppAddTimeOut (app_context, TimeoutInterval, 
  306.            (XtTimerCallbackProc) UpdateProc, NULL);
  307. }
  308. #endif  /* WINNT */
  309. #endif /* DV_USE_TIMER */
  310.  
  311. /*-----------------------------------------------------------------
  312. |
  313. |  LoadViews
  314. |       This function Pre-Loads the views....
  315. */
  316. LOCAL void LoadViews 
  317. V_P_ ((void))
  318. {
  319.   INT i;
  320.  
  321.   /* Initialize the symbol table used for storing views */
  322.   DrawportTable = VTstcreate ("ViewName/Drawport", (VTSTCOMPAREFUNPTR)NULL);
  323.  
  324.   /* Load and Draw the first View */
  325.   (VOID) init_drawport (ViewName[0]);
  326.   SwitchDisplay (NEXT_DISPLAY, ViewName[0]);
  327.  
  328.   /* For all the room views... load the view, create a drawport, add the
  329.   |  drawport to the symbol table.
  330.   */
  331.   for (i = 1; i < NUM_PRELOAD_VIEWS; i++)
  332.     (VOID) init_drawport (ViewName[i]);
  333. }
  334.  
  335. /*-----------------------------------------------------------------
  336. |
  337. |  init_drawport
  338. |       The function creates a drawport in the specified area to
  339. |       display the specified view.
  340. |
  341. |       The drawport is added to the symbol tables for easy
  342. |       access by the display manager routines.
  343. |
  344. */
  345. LOCAL DRAWPORT 
  346. init_drawport (viewname)
  347.      char *viewname;
  348. {
  349.   VIEW view;
  350.   DRAWPORT drawport = NULL;
  351.   RECTANGLE wvp, dummy;
  352.  
  353.   /* Load the view */
  354.   view = TviLoad (viewname);
  355.  
  356.   if (view)
  357.     {
  358.       /* Setup the data */
  359.       (VOID) TviOpenData (view);
  360.  
  361.       /* Setup a drawport */
  362.       VOobBox (TviGetDrawing (view), &wvp, &dummy);
  363.       drawport = TdpCreateStretch (DVscreen, view, DEF_SIZE, &wvp);
  364.  
  365.       /* Add the drawport to the table */
  366.       (VOID) VTstsninsert (DrawportTable,
  367.                     (CHAR *) StrClone (viewname), (INT *) drawport);
  368.     }
  369.   return drawport;
  370. }
  371.  
  372. /*-----------------------------------------------------------------
  373. |
  374. |  SwitchDisplay
  375. |       Switches the view being displayed in the MONITOR AREA.
  376. |
  377. |       The views are managed in a "DisplayList" which is
  378. |       updated according to the "choice".
  379. |          next_display() - Adds a display to the list.
  380. |          prev_display() - Deletes a display from the list.
  381. |
  382. |       This allows us to keep a history of where we've been.
  383. |
  384. |       The old display is terminated before the new display is
  385. |       drawn;
  386. */
  387. LOCAL void 
  388. SwitchDisplay (choice, view_name)
  389.      int choice;
  390.      char *view_name;
  391. {
  392.   DRAWPORT new_dp = NULL;
  393.  
  394.   /* If they switch to the top display, reset the NEXT/PREV list */
  395.   if (view_name && S_STRCMP (view_name, ViewName[0]) == 0)
  396.     choice = RESET_DISPLAY;
  397.  
  398.   /* Switch displays according to the choice */
  399.   switch (choice)
  400.     {
  401.     case PREV_DISPLAY:
  402.       new_dp = prev_display ();
  403.       break;
  404.     case NEXT_DISPLAY:
  405.       new_dp = next_display (view_name);
  406.       break;
  407.     case RESET_DISPLAY:
  408.       new_dp = reset_display ();
  409.       break;
  410.     default:
  411.       break;
  412.     }
  413.  
  414.   /* If we can successfully switch displays, cleanup and continue */
  415.   if (new_dp)
  416.     {
  417.       /* Draw the new display */
  418.       CurrentDrawport = new_dp;
  419.       CurrentView = TdpGetView (new_dp);
  420.       (VOID) TdpDraw (CurrentDrawport);
  421.  
  422.     }
  423. }
  424.  
  425. /*-----------------------------------------------------------------
  426. |
  427. |  next_display
  428. |       Tries to add a display to the DisplayList. If the view can't
  429. |       be displayed, returns DV_FAILURE, else DV_SUCCESS.
  430. |
  431. */
  432. LOCAL DRAWPORT 
  433. next_display (view_name)
  434.      char *view_name;
  435. {
  436.   DISPLAY_LIST *prev_display;
  437.   DRAWPORT dp;
  438.  
  439.   /* Get the drawport associated with the view */
  440.   dp = get_drawport (view_name);
  441.   if (dp)
  442.     {
  443.       /* If the list doesn't exist yet, create it.
  444.       |
  445.       |  Make the current list top the previous display. Then,
  446.       |  make the new display the list top. */
  447.       if (!DisplayList)
  448.         {
  449.           prev_display = create_display_list ();
  450.           prev_display->drawport = CurrentDrawport;
  451.         }
  452.       else
  453.         prev_display = DisplayList;
  454.  
  455.       DisplayList = create_display_list ();
  456.       DisplayList->drawport = dp;
  457.       DisplayList->prev = prev_display;
  458.     }
  459.   return dp;
  460. }
  461.  
  462. /*-----------------------------------------------------------------
  463. |
  464. |  prev_display
  465. |       If their is a previous display, make it the top and
  466. |       deletes the current from the list.
  467. */
  468. LOCAL DRAWPORT prev_display 
  469. V_P_ ((void))
  470. {
  471.   DISPLAY_LIST *prev_display;
  472.  
  473.   /* Make sure we have a list and a previous display before
  474.   |  you make the previous display the top.
  475.   */
  476.   if (DisplayList && DisplayList->prev)
  477.     {
  478.       prev_display = DisplayList->prev;
  479.       del_display_list_item (DisplayList);
  480.       DisplayList = prev_display;
  481.       return DisplayList->drawport;
  482.     }
  483.   else
  484.     return (DRAWPORT) NULL;
  485. }
  486.  
  487. /*-----------------------------------------------------------------
  488. |
  489. |  reset_display
  490. |       Resets the Display List, deletes the previous list and makes
  491. |       the TOP_VIEW the beginning of the list.
  492. */
  493. LOCAL DRAWPORT reset_display 
  494. V_P_ ((void))
  495. {
  496.  
  497.   /* Destroy the DisplayList */
  498.   FreeDisplayList (&DisplayList);
  499.  
  500.   /* return the Active Drawport to the Top View */
  501.   return get_drawport (ViewName[0]);
  502.  
  503. }
  504.  
  505. /*-----------------------------------------------------------------
  506. |
  507. |  create_display_list - Allocates and initializes a DISPLAY_LIST.
  508. */
  509. LOCAL DISPLAY_LIST *create_display_list 
  510. V_P_ ((void))
  511. {
  512.   DISPLAY_LIST *display_info;
  513.  
  514.   display_info = (DISPLAY_LIST *) S_ALLOC ((LONG) sizeof (DISPLAY_LIST));
  515.   display_info->drawport = (DRAWPORT) NULL;
  516.   display_info->prev = (DISPLAY_LIST *) NULL;
  517.   return display_info;
  518. }
  519.  
  520. /*-----------------------------------------------------------------
  521. |
  522. |  del_display_list_item - Frees a DISPLAY_LIST item.
  523. */
  524. LOCAL void 
  525. del_display_list_item (display_item)
  526.      DISPLAY_LIST *display_item;
  527. {
  528.   S_FREE ((CHAR *) display_item);
  529. }
  530.  
  531. /*-----------------------------------------------------------------
  532. |
  533. |  FreeDisplayList - Destroys the DISPLAY_LIST by freeing each item.
  534. */
  535. LOCAL void 
  536. FreeDisplayList (display_info)
  537.      DISPLAY_LIST **display_info;
  538. {
  539.   DISPLAY_LIST *info, *prev;
  540.  
  541.   info = *display_info;
  542.   while (info)
  543.     {
  544.       prev = info->prev;
  545.       del_display_list_item (info);
  546.       info = prev;
  547.     }
  548.   *display_info = NULL;
  549. }
  550.  
  551. /*-----------------------------------------------------------------
  552. |
  553. |  get_drawport
  554. |       Returns the drawport associated with the view_name. If the
  555. |       drawport doesn't exist, it creates one.
  556. */
  557. LOCAL DRAWPORT 
  558. get_drawport (view_name)
  559.      char *view_name;
  560. {
  561.   SYMNODE table_entry;
  562.  
  563.   /* See if the drawport is already in the Drawport Table */
  564.   table_entry = VTstkeyfind (DrawportTable, view_name);
  565.   if (table_entry)
  566.     return (DRAWPORT) VTsnvalue (table_entry);
  567.   else
  568.     return init_drawport (view_name);
  569. }
  570.  
  571.  
  572.  
  573. /*-----------------------------------------------------------------
  574. |
  575. |  HandlePick
  576. |       Processes user picks.
  577. |
  578. |       Checks to see if we've selected a named object. If we have
  579. |       it parses the command embedded in the name.
  580. |
  581. |       Only the first letter of the name is used for the command.
  582. |       The commands have the following meanings:
  583. |
  584. |       Quit                            - Quits the application
  585. |       N:<viewname>                    - The NEXT view is displayed
  586. |       Return                - RETURN to the previous view
  587. */
  588. LOCAL void 
  589. HandlePick (loc)
  590.      OBJECT loc;
  591. {
  592.   CHAR *obj_name, *cmd;
  593.  
  594.   /* Find the selected object */
  595.   obj_name = TloGetSelectedObjectName (loc);
  596.  
  597.   /* Handle the command associated with the object's name */
  598.   if (obj_name)
  599.     {
  600.       cmd = obj_name;
  601.  
  602.       /* Process the current command */
  603.       switch ((INT) cmd[0])
  604.         {
  605.           /* NEXT Display */
  606.         case NEXT_COMMAND:
  607.           SwitchDisplay (NEXT_DISPLAY, &cmd[2]);
  608.           break;
  609.  
  610.           /* RETRUN display */
  611.         case RETURN_COMMAND:
  612.           SwitchDisplay (PREV_DISPLAY, (CHAR *) NULL);
  613.           break;
  614.  
  615.           /* QUIT the application */
  616.         case QUIT_COMMAND:
  617.           QuitProgram ();
  618.           break;
  619.         }
  620.     }
  621. }
  622.  
  623. LOCAL void QuitProgram 
  624. V_P_ ((void))
  625. {
  626.   VIEW view;
  627.   CHAR *view_name;
  628.   SYMNODE table_entry;
  629.   DRAWPORT dp;
  630.  
  631.   /* Destroy the window's display list */
  632.   FreeDisplayList (&DisplayList);
  633.  
  634.   /* Destroy all the drawports in the drawport table */
  635.   while (VTstlen (DrawportTable) > 0)
  636.     {
  637.       table_entry = VTstsnget (DrawportTable, 0);
  638.       view_name = VTsnkey (table_entry);
  639.       S_FREE ((ADDRESS) view_name);
  640.       dp = (DRAWPORT) VTsnvalue (table_entry);
  641.       view = TdpGetView (dp);
  642.       (VOID) TdpDestroy (dp);
  643.       (VOID) TviCloseData (view);
  644.       (VOID) TviDestroy (view);
  645.       VTstsnremove (DrawportTable, table_entry);
  646.     }
  647.   /* Destroy the drawport table */
  648.   VTstdestroy (DrawportTable);
  649.  
  650.   (VOID) TscErase (DVscreen);
  651.   (VOID) TscClose (DVscreen);
  652.   (VOID) TTerminate ();
  653.   S_EXIT (0);
  654. }
  655.  
  656. /*==================================================================
  657. |
  658. |    StrClone
  659. |       Allocates space for and makes a copy of a specified string,
  660. |       returning a pointer to the string.  If there is no input
  661. |       string, the routine returns a NULL.
  662. */
  663. LOCAL CHAR *StrClone( str )
  664.   CHAR *str;
  665.   {
  666.   FAST INT len;
  667.   CHAR *newstr;
  668.   FAST CHAR *to;
  669.   FAST CHAR *from;
  670.  
  671.   if( str == NULL )
  672.     return( NULL );
  673.   len = S_STRLEN( str ) + 1;
  674.   newstr = (CHAR *)S_ALLOC( len );
  675.   if( newstr )
  676.     for( to = newstr, from = str; len > 0; len-- )
  677.       *to++ = *from++;
  678.   return( newstr );
  679.   }
  680.  
  681.